package com.errol.batchprocessor.batchprocessor;

import com.renjia.entity.AbstractImportBatch;
import com.renjia.service.generic.middleware.batchprocessor.bo.ThreadPoolAndMissionStatusBO;
import com.renjia.service.generic.middleware.batchprocessor.bo.ThreadPoolStatusBO;
import com.renjia.service.generic.middleware.batchprocessor.payload.AbstractBatchPayload;
import com.renjia.service.generic.middleware.batchprocessor.payload.AbstractPiecePayload;
import com.renjia.service.generic.middleware.batchprocessor.payload.AbstractSinglePayload;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;

/**
 * 批处理器监视器
 *
 * @author zhang xiao bin
 * @version v1.0
 * @date 2021/03/10
 * @since v5.0.6
 **/
public interface BatchProcessorMonitor<IE extends AbstractImportBatch, AT extends Enum<?>, BE, SE, BP extends AbstractBatchPayload<IE, AT, BE, SE>, PP extends AbstractPiecePayload<SE, SP>, SP extends AbstractSinglePayload<SE>> {

    /**
     * 添加一个批处理任务到人员导入线程池
     *
     * @param batchNo 批次编号
     */
    void addMissionAsync(@NonNull String batchNo);

    /**
     * 添加一个批处理任务到人员导入线程池
     *
     * @param batchPayload 批次数据
     */
    void addMissionAsync(@NonNull BP batchPayload);

    /**
     * 同步处理一条数据，处理逻辑 同批处理中处理一条记录
     * 处理一条数据的过程中，不应修改 批次数据 中数据
     *
     * @param batchPayload  批次数据
     * @param singlePayload 单条数据
     * @return SP 或者 null（执行异常）
     */
    @Nullable
    SP processSingleRecord(BP batchPayload, SP singlePayload);

    /**
     * 获取线程池状态信息
     *
     * @return 线程池主要参数和状态
     */
    ThreadPoolStatusBO getThreadPoolStatus();

    /**
     * 获取线程池和任务状态信息
     *
     * @return 线程池主要参数和任务执行进展信息
     */
    ThreadPoolAndMissionStatusBO getMissionStatus();

    /**
     * 设置线程池核心线程数，最大线程数固定为 1.5 倍
     *
     * @param targetCorePoolSize 目标核心线程数，扩大时最多增加一半，缩小时最多减少一半
     * @return 实际设置的核心线程数
     */
    int setCorePoolSize(int targetCorePoolSize);
}
